#ifndef COMM_HEADER_H
#define COMM_HEADER_H

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include "../Middlewares/myLog/myLog.h"
#include "../Middlewares/Message/message.hpp"
#include "../Conf/Conf.h"

/*定义组件类型*/
typedef enum
{
    T_R_Sub_Unit_S = 0,         // TR组件
    AD_Sub_Unit_S,              //AD组件
    WAVE_TIMING_Sub_Unit_S,     //波形与时序产生卡
    PZ_Sub_Unit_S,              //频综
    CENTER_SERVER_Sub_Unit_S,   //中控服务器
    MCU_Sub_Unit_S,             //单片机
    DEBUG_V20_Sub_Unit_S,        //调试PC-v20
    GPS_GNSS_Unit_S,            //gps模块
    Interface_Card_Unit_S,      //接口卡
    COOL_SYSTEM_Unit_S,         //液冷系统
    ServoMotor_Unit_S,    //伺服电机系统


    leixing_SERVER_Sub_Unit_S = 100,//雷象服务端


    ALL_Unit_S = 255,       //网络中所有组建
}SystemDeviceTypeDefine;

typedef enum PacketsType
{
    t_controlCmd,               //控制指令包
    t_rwDdr,                    //读写DDR指令包
    t_query,                    //查询主题指令包
    t_errorReport,              //严重错误包
    t_logReport,                //日志包
    t_serverReplyCmd,           //判断是否直接应答上位机
    t_heartBeat,                //心跳包
    t_iqCmd,                    //校准数据包 

    t_onlineUpgrade,            //升级包
    t_udpTransmit,             //udp传输包
}packets;

 //上位机指令
typedef enum serverCodeType
{
    s_SelfCheck=0,                          //自检通信
    s_ServoMotor,                           //转台控制
    s_AmpliphaseCalibration,    //幅相校准
    s_WaveCalibration,                  //波束校准
    s_SystemConfig,                         //系统参数配置
    s_TRConfig,                                 //TR组件控制
    s_PowerControl,                         //电源控制
    s_PZControl,                                 //频综控制（测试）
    s_NBJControl,                           //内标校控制
    s_SystemProcess,                    //系统主流程
    s_GPSData,                                  //GPS通信
    s_AutoUpdate,                           //自动上传
    s_CoolSystem,                           //散热系统
    s_HardwareTiming,                 //硬件调测模式时序控制（测试）
    s_UsbConfig,                              //USB控制（测试）
}serverCode;

typedef enum DDScodeType
{
    d_trCmd=0,          //tr
    d_adCmd = 1,        //ad
    d_sxCmd = 2,        //波形与时序产生卡
    d_pzCmd = 3,        //频综
    d_ServerCmd = 4,    //中控服务器
    d_mcuCmd = 5,       //MCU
    d_v20Cmd = 6,       //v20
    d_pcCmd = 7,        //pc
    d_globleCmd = 8,    //全局类
}ddsCode;

/*定义指令判断类型*/
typedef enum Control_HardWareControl
{
    CMD_DISCOL = 0,
    CMD_ENCOL,
}controlCode;


typedef enum CurrentSystemState
{
    SYS_INIT = 0,
    SYS_RUN,
    SYS_END
}SystemState;

//定义指令执行状态
typedef enum cmdStatusType
{
    CMD_OK = 0,             //执行成功
    CMD_ERR,                //错误指令
    CMD_INVAL,              //无效指令
    CMD_BUSY,               //组件忙
    CMD_TIMEOUT,            //执行超时
    CMD_FAIL,               //执行失败
    CMD_ILLSTATE,           //协议栈处于非法状态
}SystemStatusTypeDefine;

//定义组件当前工作模式
typedef enum SystemStatusType
{
    m_Idle = 0,                 //空闲模式
    m_Operating ,               //工作模式
    m_Test,                     //测试模式
    m_Upgrading,                //升级模式
}ModuleStatus;

extern SystemState sysRunStatus;

/***************************定义当前组件设备类型************************************/
#define CurDeviceType WAVE_TIMING_Sub_Unit_S
#define ComponentNO     0
#define CURRENT_DEVICE_TYPE "时序卡组件"
#define DEST_DEVICE_TYPE "小上位机"

#define allDevice   255

#define UDP_BLOCK_SIZE 1400
// #define __DEBUG__  
// #ifdef __DEBUG__  
// #define DEBUG(format,...) printf("File: "__FILE__", Line: %05d:" format"/n", __LINE__, ##__VA_ARGS__)  
// #else  
// #define DEBUG(format,...)  
// #endif  

#define PROTOCOL_HEAD  0x5555AAAA
#define PROTOCOL_TAIL  0xAAAA5555

#pragma pack(push, 1)
//雷象数据格式
struct dataType
{  
    uint32_t head;
    uint16_t cmdType;
    uint16_t cmdChildType;
    uint32_t followData;
    uint32_t dataLen;
    uint32_t tail;
};

/***************************************************************
*嵌入式数据长度	含义	取值	备注
*1	包类型	0-255	区别不同的数据包
*1	源组件类型	0-255	发送包的组件类型
*1	源组件编号	0-255	发送包的组件编号
*1	目的组件类型	0-255	接收包的组件类型
*1	目的组件编号	0-255	接收包的组件编号
*1	指令主编号	0-255	与包类型、指令副编号一起构成唯一指令
*1	指令副编号	0-255	与包类型、指令主编号一起构成唯一指令
*1	执行状态	0-255	指令执行状态，仅回复包有实际意义。
*4	数据长度	N	实际数据长度，0表示无数据
****************************************************************/
struct cmdDataType{
    uint8_t DeviceType;
    uint8_t source_DevType;
    uint8_t source_DevNum;
    uint8_t dst_DevType;
    uint8_t dst_DevNum;
    uint8_t cmdType;
    uint8_t cmdChildType;
    uint8_t DevStatus;
    uint32_t dataLen;
};
#pragma pack(pop)

struct lxDataType
{
    struct dataType * cmdHead;
    uint8_t * dataEntity;
};

struct privateData
{
    struct cmdDataType * cmdHead;
    uint8_t * dataEntity;
};

typedef enum uio_modeConf
{
    uio_h_sendPolar,                //H发射校准
    uio_v_sendPolar,                //v发射校准
    uio_h_recvicePolar,             //H接收校准
    uio_v_recvicePolar,             //V接收校准
    uio_autoMode,                   //自动校准模式
    uio_tx_observer,                //发射观测
    uio_dbf_observer,               //DBF观测
    uio_adc_observer,               //ADC观测
    uio_rx_observer,                //接收校准观测   
    uio_rx_obsChan0,                //接收IQ观测数据源选择0：H极化频点0数据
    uio_rx_obsChan1,                //接收IQ观测数据源选择1：H极化频点1数据
    uio_rx_obsChan2,                //接收IQ观测数据源选择2：V极化频点0数据
    uio_rx_obsChan3,                //接收IQ观测数据源选择3：V极化频点1数据
    uio_noReply,
}uioMode;

typedef int (*CallbackCmdFun)(struct cmdDataType* cmd,uint8_t * cmdData);

// extern bool g_bQuit;
#endif
